package middlewareWeb;

import java.util.*;


/**
 * Classe per la gestione della coda che implementa l'interfaccia TQueue
 * @author myusy
 */
public class TQueueManager extends Observable implements TQueue{
    private Address addr;
    private Vector<TaskDescriptor> tQueue;

     /**
     * Metodo costruttore della classe TQueueManager
     *
     */
    public TQueueManager(){
        tQueue = new Vector<TaskDescriptor>();
    }

    /**
     * Metodo che restitutisce l'indirizzo
     * @return oggetto Address (riferito al worker?)
     */
    public Address getAddr(){
        return addr;
    }
    
    /**
     * Metodo per settare l'Address
     * @param val Address da inserire
     */
    public void setAddr(Address val){
        addr=val;
    }
    
    /**
     * Metodo che restitutisce la coda di task
     * @return Vettore di descrittori di task da eseguire
     */
    public synchronized Vector<TaskDescriptor> getTQueue(){
        return tQueue;
    }
    
    /**
     * Metodo per settare la coda di descrittori
     * @param val Vettore dei descrittori
     */
    public void setTQueue(Vector<TaskDescriptor> val){
        tQueue=val;
    }

    /**
     * Implementazione del metodo di interfaccia per l'aggiunta di un
     * Task descriptor alla coda
     * @param td descrittore del task
     */
    public synchronized int enqueue(TaskDescriptor td){
        //Riceverà il task descriptor mediante il socket
        this.setChanged();
        //this.notifyObservers();
        tQueue.add(td);
        return tQueue.indexOf(td);
    }
     /**
     * Implementazione del metodo di interfaccia per l'estrazione di un
     * Task descriptor dalla coda
     * @return il task descriptor
     */
    public synchronized TaskDescriptor dequeue(){
        //Estrazione del task descriptor in locale in quanto oggetto del worker
        if (tQueue.size()>0) {
            TaskDescriptor task = tQueue.firstElement();
            tQueue.remove(0);
            return task;
        }
        return null;
    }
    /**
     * Implementazione del metodo che restituisce l'0ggetto TQueueManager
     * sottoforma di stringa contenente tag XML
     * @return stringa con contenuto tag XML
     */
    public synchronized String toXML(){
        String s= "<Coda port="+addr.getPort()+" ip="+addr.getIp()+">";
        int i=0;
        while ( i<tQueue.size() ) {
        s+=tQueue.elementAt(i++).toXML();
        }
        s+="</Coda>";
        //System.out.println(s +"dentro il metodo");
        return s;
    }

    /**
     * Override del metodo toString() per l'oggetto TQueueManager
     * @return stringa che rappresenta l'oggetto TQueueManager
     */
    public String toString(){
        return "Address: " + this.addr + " Vettore di task: " + this.tQueue + " ";
    }
}
